package map;

import java.util.*;
import java.util.function.Consumer;

/**
 * map提供了三种遍历方式：
 * 1、遍历所有的key
 * 2、遍历每一组键值对
 * 3、遍历所有的value（相对不常用）
 */
public class MapDemo2 {
    public static void main(String[] args) {
        Map<String,Integer> map = new HashMap<>();
        map.put("语文",99);
        map.put("数学",98);
        map.put("英语",97);
        map.put("物理",96);
        map.put("化学",95);
        System.out.println(map);

        /**
         * 遍历所有的key
         * Set keySet()
         * 将当前map中所有的key以一个set集合形式返回
         */
        Set<String> keySet = map.keySet();
        for (String key : keySet){
            System.out.println("key:"+key);
        }

        /**
         * 遍历每一组键值对
         * Set entrySet()
         * 将当前map中每一组键值对以一个Entry实例表示
         * 并最总以set集合形式返回所有的键值对
         *
         * Map.Entry 的每一个实例用于表示map中的一组键值对
         * 有两个常用方法：
         * K getKey():获取key
         * V getVaule():获取value
         */
        Set<Map.Entry<String,Integer>> entrySet = map.entrySet();
        for (Map.Entry<String,Integer> e : entrySet){
            String key = e.getKey();
            Integer value = e.getValue();
            System.out.println(key+":"+value);
        }

        /**
         * 遍历所有的value
         * Collection values()
         * 将当前map中所有的value以一个集合形式返回
         */
        Collection<Integer> values = map.values();
        for (Integer value : values){
            System.out.println("value:"+value);
        }

        Collection<String> c = new ArrayList<>();
        c.add("one");
        c.add("two");
        c.add("three");
        c.add("four");
        c.add("five");
        for (String e : c){
            System.out.println(e);
        }
        /**
         * JDK8之后集合和map都提供了forEach方法基于lambda表达式遍历
         */
        c.forEach(s-> System.out.println(s));

        /**
         * lambda表达式变种写法 方法引用
         */
        c.forEach(System.out::println);

        /**
         * map提供的forEach方法基于lambda表达式遍历
         */
        map.forEach((k,v)-> System.out.println(k+":"+v));
    }
}
